/*****			as608功能模块
****	1.通过串口1通讯
****	2.根据提示要求输入的指令实现各种功能
****	3.录入指纹时需靠近指纹模块发光源处并等待3s的录入时间
*****/

#include "as608_test.h"
#include "as608.h"
#include "usart.h"
#include "led.h"
#include "pwm.h"
#include "tim5.h"
extern uint8_t TouchOut_int_flag;

//---------指令解析
void Show_Message(void)
{
	
	 
  //AS608_INFO("pls input");
  //AS608_INFO("请输入指令，输入指令后请在输入窗口按回车键后再发送指令！！！\r\n");
  
		n = 8;
		SysTick_Delay_Ms(2000);
		OLED_Clear();
		AS608_INFO("CMD function");
    AS608_INFO("1 - Add FRP");
		AS608_INFO("2 - Contrast FPR");
		AS608_INFO("3 - del FPR");
		AS608_INFO("4 - del FPR libs");  
}



//-----------指纹模块操作
void  FR_Task(void)
{	
  uint32_t   ch;
 // scanf("%d",&ch);
	while( !(ch = MatrixKey_GetValue()))
	{
		;
	}
  printf("recv:%d",ch);
	OLED_ShowString(0,n,"recv :",6);
	OLED_Update();
	OLED_ShowNum(0,n,ch,2,6);
  n += 8;
	OLED_Update();
  switch(ch)
  {
    case 1:
			n = 8;
			OLED_Clear();
      Add_FR();                                    /*添加指纹*/
		  Show_Message();
    break;
			
		case 2:
			n = 8;
			OLED_Clear();
      Compare_FR();                                /*比对指纹*/
		  Show_Message();
    break;

    case 3:
			n = 8;
			OLED_Clear();
      Del_FR();                                    /*删除指定用户指纹*/
		  Show_Message();
    break;
			
    case 4:
			n = 8;
			OLED_Clear();
      Clean_FR();                                  /*清空指纹库*/
		  Show_Message();
    break;
   
    default:
      /* 如果不是指定指令字符，打印提示信息 */
		  AS608_INFO("Pls enter a legal cmd");
      Show_Message();
    break;      
  }
  return;		
}

//--------检测与指纹模块的通信
void  Connect_Test(void)
{   
  Usart_SendString( USART1,"This is a fingerprint module experiment\r\n");
	
  AS608_INFO("Welcome to the STM32 ");
	
  if(PS_Connect(&AS608_Addr))                      /*与AS608串口通信*/
  { 
    AS608_INFO("No fingerprint module detected");			  
		AS608_INFO(" please check the connection");	
  }
  else
  {
	AS608_INFO("communication ok");
	Show_Message();
  }
}

//---------录指纹
void  Add_FR(void)
{
  uint16_t  i,j,sure,ID;
 
  i=j=0;
	
  while(1)
  {
    switch (j)
    {
      case 0:                            /*执行第1步*/
        
        i++;

        AS608_INFO("Pls press your finger");
	  
//        /*确保是否产生了EXTI Line中断*/
//		if(EXTI_GetITStatus(EXTI_Line0) != RESET) //判断EXTI0的新状态，EXTI默认是RESET低电平
//		{
//		/*LED1反转*/	
//		LED1_TOGGLE;
			
        sure=PS_GetImage();              /*录入图像*/
		      
        if(sure == 0x00)				 /*0x00---录入成功*/
        {
          sure=PS_GenChar(CHAR_BUFFER1);  /*生成特征1*/
			
			//测试
			LED_GPIO_Config();
			

          if(sure==0x00)				/*0x00---生成特征成功*/
          { 
				    AS608_INFO("Enter FRP 1 Normal");
					
			  
            sure=PS_HighSpeedSearch(CHAR_BUFFER1,0,PS_MAXNUM,&ID);  	/*搜索指纹库*/
            if(sure==0x00)
            {
							AS608_INFO ("FRP already exists");
              AS608_INFO ("FRP ID: ");
							printf("%d",ID);
							OLED_ShowNum(0,n,ID,2,6);
							n+=8;
							OLED_Update();
             return ;
            }              
            else 
            {
              i=0;
              j=1;                   /*跳转到第2步*/
             }
           }
				 else
				 {
					 ShowErrMessage(sure);	  	/*生成特征 返回码有误*/       
				 }
        }
			  else 
			  {
				  ShowErrMessage(sure);			/*录入图像 返回码有误*/
			  }
//			  
//	  EXTI_ClearITPendingBit(EXTI_Line0);   //清除EXTI行，以备下次中断的到来
//		  }
      break;


      case 1:	 						/*第2步*/
        
        i++;
      
        AS608_INFO("Pls your FRP again");
	  
//		if(EXTI_GetITStatus(EXTI_Line0) != RESET) //判断EXTI0的新状态，EXTI默认是RESET低电平
//		{
//		/*LED1反转*/	
//		LED1_TOGGLE;
			
        sure=PS_GetImage();
        if(sure==0x00)
        { 
          sure=PS_GenChar(CHAR_BUFFER2);  /*生成特征2*/
          if(sure==0x00)
          { 
				    AS608_INFO("Enter FRP 2 Normal");
            i=0;
            j=2;                   /*跳转到第3步*/
          }
				  else 
				  {
					  ShowErrMessage(sure);
				  }

         }
			   else 
			   {
			   ShowErrMessage(sure);
         }				
       break;

			
       case 2:
         
         AS608_INFO("comparing the two prints");
       
         sure=PS_Match();                /*精确比对两枚指纹特征*/
         if(sure==0x00) 
         {
				   AS608_INFO("Enter FRP comparison OK");
           
           j=3;                         /*跳转到第4步*/
         }
         else
         {
           AS608_INFO("NO,Pls enter the FRP");
           ShowErrMessage(sure);
           i=0;
           j=0;
         }
		 
//         EXTI_ClearITPendingBit(EXTI_Line0);   //清除EXTI行，以备下次中断的到来
//		}
       break;
       
         
       case 3:
         
         AS608_INFO("FRP module create");
       
         sure=PS_RegModel();            /*合并特征（生成模板）*/
         if(sure==0x00) 	
         {
           AS608_INFO("OK create FRP module");
           j=4;                        /*跳转到第5步*/
         } 
         else 
        {
         j =0;
         ShowErrMessage(sure);
        }
        
       break;
        

       case 4:
        
         do
         { 
           AS608_INFO ("EnterID.value 0-23");
        
           ID=GET_NUM();
         }while(!(ID<PS_MAXNUM));
        
         sure=PS_StoreChar(CHAR_BUFFER2,ID);  /*储存模板*/
         if(sure==0x00) 	
         {
           AS608_INFO("Enter FRP module OK");
      
           return ;
         } 
         else 
         {
           j =0;
           ShowErrMessage(sure);
         }
       break;
      }
    
      SysTick_Delay_Ms(1000);
      
      if(i==4)                       /*超过4次没有按手指则退出*/
      { 
        AS608_INFO("Failed to record FRP");

        break;
      }
  }
}


//---------比对指纹（识别指纹）
void Compare_FR(void)  
{  
  uint16_t  ID=0;                    /*初始化ID值*/  
  uint16_t  sure;
	
  AS608_INFO("Parity,Pls press finger");
  
//  if(EXTI_GetITStatus(EXTI_Line0) != RESET) //判断EXTI0的新状态，EXTI默认是RESET低电平
//		{
//		/*LED1反转*/	
//		LED1_TOGGLE;
			
  sure=PS_GetImage();

  if(sure == 0x00)
  {
    sure=PS_GenChar(CHAR_BUFFER1);    /*生成特征1*/
    if(sure==0x00)
    {  
			/*高速搜索指纹库*/
      sure=PS_HighSpeedSearch(CHAR_BUFFER1,0,PS_MAXNUM,&ID);
      if(sure==0x00)
      {
        AS608_INFO ("OK,FRP ID:");
				printf("%d\n",ID);
				pwm_SetCompare(2500);
				OLED_ShowNum(0,n,ID,2,6);
				n+=8;
				OLED_Update();
				tim5_delay_ms(1000);
				pwm_SetCompare(500);
      }
      else 
      {
			ShowErrMessage(sure);
			}
    }
    else 
    {   
      ShowErrMessage(sure);	
    }
  }
	else  
	{
	  ShowErrMessage(sure);
	}
//	EXTI_ClearITPendingBit(EXTI_Line0);   //清除EXTI行，以备下次中断的到来
//		  }
}


//----------清空指纹库
void Clean_FR(void) 
{
  uint16_t  sure;
  
	AS608_INFO("Clean the FRP libs");
  
	sure=PS_Empty();     
	if(sure == 0x00)
	{
		AS608_INFO("Clean FRP libs OK");
	}
	else 
	{
		ShowErrMessage(sure);
	}

}


//--------删除指定用户指纹
void Del_FR(void)
{ 
	uint32_t  ID;
	uint16_t  sure;
  
	AS608_INFO("DLE specified ID");
  
	do
	{ 
		AS608_INFO ("Enter storage ID.0-23");
		ID=GET_NUM();
	}while(!(ID<PS_MAXNUM));         /*输入ID不能超过指纹模块最大容量*/
	
	sure=PS_DeletChar(ID,1);         /*删除指定用户的指纹模板*/
	
	if(sure == 0x00)                
	{
		AS608_INFO("DLE specified FRP OK");
	}
	else 
	{
		ShowErrMessage(sure);
	}
}

